loading packages
suppressPackageStartupMessages(library(tidyverse))
suppressPackageStartupMessages(library(sjPlot))
suppressPackageStartupMessages(library(lme4))
suppressPackageStartupMessages(library(performance))
suppressPackageStartupMessages(library(nortest))
options(scipen = 999)
importing dataset
dat_model <- read_csv("data/data_model.csv")
baseline model

trait rumination
# building model
trait_model <-
lmer(
NA_sum ~ age + gender + beep + day +
event_unpleasantness_centered * trait_rumination +
(event_unpleasantness_centered | id),
data = dat_model
)
# model outputs
summary(trait_model)
Linear mixed model fit by REML ['lmerMod']
Formula: NA_sum ~ age + gender + beep + day + event_unpleasantness_centered *
trait_rumination + (event_unpleasantness_centered | id)
Data: dat_model
REML criterion at convergence: 33508.9
Scaled residuals:
Min 1Q Median 3Q Max
-4.5777 -0.4677 -0.0848 0.2800 7.6410
Random effects:
Groups Name Variance Std.Dev. Corr
id (Intercept) 0.77855 0.8824
event_unpleasantness_centered 0.03429 0.1852 0.59
Residual 0.56096 0.7490
Number of obs: 14265, groups: id, 247
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.2160764 0.1728315 1.250
age -0.0047372 0.0041325 -1.146
genderMale -0.1152025 0.1390809 -0.828
genderOther 0.0497428 0.7339194 0.068
beep 0.0051633 0.0029599 1.744
day -0.0047750 0.0008425 -5.668
event_unpleasantness_centered 0.3053063 0.0143028 21.346
trait_rumination 0.3551413 0.0664066 5.348
event_unpleasantness_centered:trait_rumination 0.0779311 0.0150512 5.178
Correlation of Fixed Effects:
(Intr) age gndrMl gndrOt beep day evnt__ trt_rm
age -0.925
genderMale -0.190 0.040
genderOther -0.071 0.047 0.059
beep -0.069 -0.001 -0.002 0.000
day -0.041 -0.002 0.002 -0.003 0.008
evnt_nplsn_ 0.159 0.011 -0.036 0.013 0.035 0.011
trait_rmntn -0.308 0.281 0.289 0.082 -0.006 -0.005 -0.014
evnt_npl_:_ 0.010 -0.018 0.030 -0.015 0.003 -0.003 -0.078 0.457
tab_model(trait_model, show.std = T)
# assumption checks
check_collinearity(trait_model)
# Check for Multicollinearity
Low Correlation
Term VIF VIF 95% CI Increased SE Tolerance Tolerance 95% CI
age 1.12 [1.11, 1.15] 1.06 0.89 [0.87, 0.90]
gender 1.12 [1.10, 1.14] 1.06 0.89 [0.87, 0.91]
beep 1.00 [1.00, 138.99] 1.00 1.00 [0.01, 1.00]
day 1.00 [1.00, Inf] 1.00 1.00 [0.00, 1.00]
event_unpleasantness_centered 1.01 [1.00, 1.05] 1.01 0.99 [0.95, 1.00]
trait_rumination 1.58 [1.54, 1.61] 1.26 0.63 [0.62, 0.65]
event_unpleasantness_centered:trait_rumination 1.34 [1.31, 1.36] 1.16 0.75 [0.73, 0.76]
plot_model(trait_model, type = "diag")
[[1]]
[[2]]
[[2]]$id
[[3]]
[[4]]




#check_model(trait_model)
# visualizing predicted values
plot_model(trait_model)

# goodness of fit indicators
AIC_trait <- AIC(trait_model)
BIC_trait <- BIC(trait_model)
coefplot for trait rumination
coefplot_trait <-
plot_model(trait_model,
type = "std",
rm.terms = c("age", "gender [Male]", "gender [Other]", "beep", "day", "event_unpleasantness_centered"),
ci.lvl = 0.95,
std.est = T,
title = "",
show.values = TRUE,
colors = "black",
axis.labels = c("Trait rumination * Perceived stress", "Trait rumination"),
axis.title = "Standardized β coefficients"
) +
ylim(0, 0.6) +
theme_minimal() +
theme(axis.line = element_line(size = .3),
axis.text = element_text(size = 10, color = "black"),
axis.title.x = element_text(size = 12, color = "black")
)
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
coefplot_trait

mean state rumination
# building model
mean_state_model <-
lmer(
NA_sum ~ age + gender + beep + day +
event_unpleasantness_centered * mean_state_rumi_grand_centered +
(event_unpleasantness_centered | id),
data = dat_model
)
# model outputs
summary(mean_state_model)
Linear mixed model fit by REML ['lmerMod']
Formula: NA_sum ~ age + gender + beep + day + event_unpleasantness_centered *
mean_state_rumi_grand_centered + (event_unpleasantness_centered | id)
Data: dat_model
REML criterion at convergence: 33378.9
Scaled residuals:
Min 1Q Median 3Q Max
-4.5871 -0.4680 -0.0864 0.2809 7.6518
Random effects:
Groups Name Variance Std.Dev. Corr
id (Intercept) 0.42164 0.6493
event_unpleasantness_centered 0.03091 0.1758 0.51
Residual 0.56109 0.7491
Number of obs: 14265, groups: id, 247
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.1402751 0.1291530 1.086
age -0.0032922 0.0031130 -1.058
genderMale -0.0501490 0.1062399 -0.472
genderOther 0.1741375 0.5730614 0.304
beep 0.0049676 0.0029591 1.679
day -0.0048631 0.0008409 -5.783
event_unpleasantness_centered 0.3068529 0.0138163 22.209
mean_state_rumi_grand_centered 0.9105524 0.0598964 15.202
event_unpleasantness_centered:mean_state_rumi_grand_centered 0.1227505 0.0188286 6.519
Correlation of Fixed Effects:
(Intr) age gndrMl gndrOt beep day evnt__ mn____
age -0.922
genderMale -0.129 -0.027
genderOther -0.053 0.028 0.045
beep -0.095 -0.001 -0.002 0.001
day -0.055 -0.004 0.005 -0.004 0.007
evnt_nplsn_ 0.139 0.005 -0.033 0.010 0.036 0.011
mn_stt_rm__ -0.182 0.155 0.200 0.061 -0.009 -0.001 -0.015
evnt__:____ 0.016 -0.021 0.001 -0.012 0.004 -0.002 -0.063 0.387
tab_model(mean_state_model, show.std = T)
# assumption checks
check_collinearity(mean_state_model)
# Check for Multicollinearity
Low Correlation
Term VIF VIF 95% CI Increased SE Tolerance
age 1.04 [1.02, 1.06] 1.02 0.96
gender 1.06 [1.04, 1.08] 1.03 0.94
beep 1.00 [1.00, 64.69] 1.00 1.00
day 1.00 [1.00, Inf] 1.00 1.00
event_unpleasantness_centered 1.01 [1.00, 1.08] 1.00 0.99
mean_state_rumi_grand_centered 1.28 [1.26, 1.31] 1.13 0.78
event_unpleasantness_centered:mean_state_rumi_grand_centered 1.20 [1.18, 1.23] 1.10 0.83
Tolerance 95% CI
[0.94, 0.98]
[0.92, 0.96]
[0.02, 1.00]
[0.00, 1.00]
[0.93, 1.00]
[0.76, 0.79]
[0.82, 0.85]
plot_model(mean_state_model, type = "diag")
[[1]]
[[2]]
[[2]]$id
[[3]]
[[4]]




#check_model(mean_state_model)
# visualizing predicted values
plot_model(mean_state_model)

# goodness of fit indicators
AIC_mean_state <- AIC(mean_state_model)
BIC_mean_state <- BIC(mean_state_model)
coefplot for mean state rumination
coefplot_mean_state <-
plot_model(mean_state_model,
type = "std",
rm.terms = c("age", "gender [Male]", "gender [Other]", "beep", "day", "event_unpleasantness_centered"),
ci.lvl = 0.95,
std.est = T,
title = "",
show.values = TRUE,
colors = "black",
axis.labels = c("Mean state rumination * Perceived stress", "Mean state rumination"),
axis.title = "Standardized β coefficients"
) +
ylim(0, 0.6) +
theme_minimal() +
theme(axis.line = element_line(size = .3),
axis.text = element_text(size = 10, color = "black"),
axis.title.x = element_text(size = 12, color = "black")
)
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
coefplot_mean_state

state rumination
# building model
state_model <-
lmer(
NA_sum ~ age + gender + beep + day +
event_unpleasantness_centered * rumination_centered +
(event_unpleasantness_centered | id), data = dat_model
)
# model outputs
summary(state_model)
Linear mixed model fit by REML ['lmerMod']
Formula: NA_sum ~ age + gender + beep + day + event_unpleasantness_centered *
rumination_centered + (event_unpleasantness_centered | id)
Data: dat_model
REML criterion at convergence: 31593.7
Scaled residuals:
Min 1Q Median 3Q Max
-4.5625 -0.4499 -0.0771 0.2846 8.2712
Random effects:
Groups Name Variance Std.Dev. Corr
id (Intercept) 0.86414 0.9296
event_unpleasantness_centered 0.02793 0.1671 0.66
Residual 0.48929 0.6995
Number of obs: 14265, groups: id, 247
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.4238103 0.1637515 2.588
age -0.0090868 0.0039334 -2.310
genderMale -0.2758397 0.1338196 -2.061
genderOther -0.1560593 0.7273910 -0.215
beep 0.0009888 0.0027650 0.358
day -0.0045018 0.0007871 -5.720
event_unpleasantness_centered 0.2545536 0.0129058 19.724
rumination_centered 0.2651076 0.0066691 39.751
event_unpleasantness_centered:rumination_centered 0.0386275 0.0038579 10.013
Correlation of Fixed Effects:
(Intr) age gndrMl gndrOt beep day evnt__ rmntn_
age -0.912
genderMale -0.094 -0.066
genderOther -0.039 0.016 0.031
beep -0.072 0.002 0.001 0.001
day -0.043 0.001 0.002 -0.002 0.008
evnt_nplsn_ 0.206 0.003 -0.050 0.012 0.040 0.011
rmntn_cntrd 0.015 -0.009 -0.014 -0.005 -0.029 -0.005 -0.076
evnt_npl_:_ -0.009 0.001 0.006 -0.001 -0.005 0.022 -0.031 -0.299
tab_model(state_model, show.std = T)
# assumption checks
check_collinearity(state_model)
# Check for Multicollinearity
Low Correlation
Term VIF VIF 95% CI Increased SE Tolerance Tolerance 95% CI
age 1.00 [1.00, 1.15] 1.00 1.00 [0.87, 1.00]
gender 1.01 [1.00, 1.07] 1.00 0.99 [0.94, 1.00]
beep 1.00 [1.00, 2.67] 1.00 1.00 [0.37, 1.00]
day 1.00 [1.00, 1.87e+07] 1.00 1.00 [0.00, 1.00]
event_unpleasantness_centered 1.01 [1.00, 1.05] 1.01 0.99 [0.96, 1.00]
rumination_centered 1.11 [1.09, 1.13] 1.05 0.90 [0.88, 0.92]
event_unpleasantness_centered:rumination_centered 1.10 [1.08, 1.12] 1.05 0.91 [0.89, 0.92]
plot_model(state_model, type = "diag")
[[1]]
[[2]]
[[2]]$id
[[3]]
[[4]]




#check_model(state_model)
# visualizing predicted values
plot_model(state_model)

# goodness of fit indicators
AIC_state <- AIC(state_model)
BIC_state <- BIC(state_model)
# outputs for trait, mean state and state models
tab_model(trait_model, mean_state_model, state_model, show.std = T)
coefplot for state rumination
coefplot_state <-
plot_model(state_model,
type = "std",
rm.terms = c("age", "gender [Male]", "gender [Other]", "beep", "day", "event_unpleasantness_centered"),
ci.lvl = 0.95,
std.est = T,
title = "",
show.values = TRUE,
colors = "black",
axis.labels = c("State rumination * Perceived stress", "State rumination"),
axis.title = "Standardized β coefficients"
) +
ylim(0, 0.6) +
theme_minimal() +
theme(axis.line = element_line(size = .3),
axis.text = element_text(size = 10, color = "black"),
axis.title.x = element_text(size = 12, color = "black")
)
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
coefplot_state

full model
check_model(full_model)
Package `see` required for model diagnostic plots.
coefplots for full model
# plot for interactions (colored afterwards in photoshop)
coefplot_interactions <-
plot_model(full_model,
type = "std",
rm.terms = c("rumination_centered", "trait_rumination", "mean_state_rumi_grand_centered", "age", "gender [Male]", "gender [Other]", "beep", "day", "event_unpleasantness_centered"),
ci.lvl = 0.95,
std.est = T,
title = "",
show.values = TRUE,
colors = "black",
axis.labels = c("Trait rumination * Perceived stress", "Mean state rumination * Perceived stress", "State rumination * Perceived stress"),
axis.title = "Standardized β coefficients"
) +
ylim(0, 0.1) +
theme_minimal() +
theme(axis.text = element_text(size = 10, color = "black"),
axis.title.x = element_text(size = 12, color = "black"),
axis.line = element_line(size = .3)
)
Warning: Model failed to converge with max|grad| = 0.00403381 (tol = 0.002, component 1)Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
coefplot_interactions

# plot for main effects (colored afterwards in photoshop)
coefplot_maineffects <-
plot_model(full_model,
type = "std",
terms = c("rumination_centered", "mean_state_rumi_grand_centered", "trait_rumination"),
ci.lvl = 0.95,
std.est = TRUE,
title = "",
show.values = TRUE,
colors = "black",
axis.labels = c("Trait rumination", "Mean state rumination", "State rumination"),
axis.title = "Standardized β coefficients"
) +
ylim(0, 1) +
theme_minimal() +
theme(axis.text = element_text(size = 10, color = "black"),
axis.title.x = element_text(size = 12, color = "black"),
axis.line = element_line(size = .3)
)
Warning: Model failed to converge with max|grad| = 0.00403381 (tol = 0.002, component 1)Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
coefplot_maineffects

saving full model for bootstrapping
saveRDS(full_model, "saved_models/full_model.rds")
LS0tCnRpdGxlOiAiMDNfbW9kZWxzIgphdXRob3I6ICJGbG9yYSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICBodG1sX25vdGVib29rOgogICAgZmlnX3dpZHRoOiAxMgogICAgZmlnX2hlaWdodDogNAplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKIyBsb2FkaW5nIHBhY2thZ2VzCmBgYHtyfQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeSh0aWR5dmVyc2UpKQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShzalBsb3QpKQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShsbWU0KSkKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkocGVyZm9ybWFuY2UpKQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShub3J0ZXN0KSkKCm9wdGlvbnMoc2NpcGVuID0gOTk5KQpgYGAKCgojIGltcG9ydGluZyBkYXRhc2V0CmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmRhdF9tb2RlbCA8LSByZWFkX2NzdigiZGF0YS9kYXRhX21vZGVsLmNzdiIpCmBgYAoKCiMgYmFzZWxpbmUgbW9kZWwKYGBge3J9CiMgYnVsaWRpbmcgbW9kZWwKYmFzZWxpbmVfbW9kZWwgPC0KICBsbWVyKE5BX3N1bSB+IGFnZSArIGdlbmRlciArIGJlZXAgKyBkYXkgKyAKICAgICAgZXZlbnRfdW5wbGVhc2FudG5lc3NfY2VudGVyZWQgKwogICAgICAoZXZlbnRfdW5wbGVhc2FudG5lc3NfY2VudGVyZWQgfCBpZCksCiAgICAgIGRhdGEgPSBkYXRfbW9kZWwKICApCgoKIyBtb2RlbCBvdXRwdXRzCnN1bW1hcnkoYmFzZWxpbmVfbW9kZWwpCnRhYl9tb2RlbChiYXNlbGluZV9tb2RlbCwgc2hvdy5zdGQgPSBUKQoKCiMgYXNzdW1wdGlvbiBjaGVja3MKY2hlY2tfY29sbGluZWFyaXR5KGJhc2VsaW5lX21vZGVsKQpwbG90X21vZGVsKGJhc2VsaW5lX21vZGVsLCB0eXBlID0gImRpYWciKQojIGNoZWNrX21vZGVsKGJhc2VsaW5lX21vZGVsKQoKCiMgdmlzdWFsaXppbmcgcHJlZGljdGVkIHZhbHVlcwpwbG90X21vZGVsKGJhc2VsaW5lX21vZGVsKQoKCiMgZ29vZG5lc3Mgb2YgZml0IGluZGljYXRvcnMKQUlDX2Jhc2VsaW5lIDwtIEFJQyhiYXNlbGluZV9tb2RlbCkKQklDX2Jhc2VsaW5lIDwtIEJJQyhiYXNlbGluZV9tb2RlbCkKCgojIG5vcm1hbGl0eSB0ZXN0IGZvciByZXNpZHVhbHMKYmFzZWxpbmVfbW9kZWxfcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhiYXNlbGluZV9tb2RlbCkKbGlsbGllLnRlc3QoYmFzZWxpbmVfbW9kZWxfcmVzaWR1YWxzKQoKCiMgbm9ybWFsaXR5IHRlc3QgZm9yIE5BX3N1bQpsaWxsaWUudGVzdChkYXRfbW9kZWwkTkFfc3VtKQpgYGAKCgojIHRyYWl0IHJ1bWluYXRpb24KYGBge3J9CiMgYnVpbGRpbmcgbW9kZWwKdHJhaXRfbW9kZWwgPC0KICBsbWVyKAogICAgTkFfc3VtIH4gYWdlICsgZ2VuZGVyICsgYmVlcCArIGRheSArCiAgICBldmVudF91bnBsZWFzYW50bmVzc19jZW50ZXJlZCAqIHRyYWl0X3J1bWluYXRpb24gKwogICAgKGV2ZW50X3VucGxlYXNhbnRuZXNzX2NlbnRlcmVkIHwgaWQpLAogICAgICBkYXRhID0gZGF0X21vZGVsCiAgICApCgoKIyBtb2RlbCBvdXRwdXRzCnN1bW1hcnkodHJhaXRfbW9kZWwpCnRhYl9tb2RlbCh0cmFpdF9tb2RlbCwgc2hvdy5zdGQgPSBUKQoKCiMgYXNzdW1wdGlvbiBjaGVja3MKY2hlY2tfY29sbGluZWFyaXR5KHRyYWl0X21vZGVsKQpwbG90X21vZGVsKHRyYWl0X21vZGVsLCB0eXBlID0gImRpYWciKQojY2hlY2tfbW9kZWwodHJhaXRfbW9kZWwpCgoKIyB2aXN1YWxpemluZyBwcmVkaWN0ZWQgdmFsdWVzCnBsb3RfbW9kZWwodHJhaXRfbW9kZWwpCgoKIyBnb29kbmVzcyBvZiBmaXQgaW5kaWNhdG9ycwpBSUNfdHJhaXQgPC0gQUlDKHRyYWl0X21vZGVsKQpCSUNfdHJhaXQgPC0gQklDKHRyYWl0X21vZGVsKQpgYGAKCgojIyBjb2VmcGxvdCBmb3IgdHJhaXQgcnVtaW5hdGlvbgpgYGB7cn0KY29lZnBsb3RfdHJhaXQgPC0gCiAgcGxvdF9tb2RlbCh0cmFpdF9tb2RlbCwKICAgICAgICAgICAgIHR5cGUgPSAic3RkIiwKICAgICAgICAgICAgIHJtLnRlcm1zID0gYygiYWdlIiwgImdlbmRlciBbTWFsZV0iLCAiZ2VuZGVyIFtPdGhlcl0iLCAiYmVlcCIsICJkYXkiLCAiZXZlbnRfdW5wbGVhc2FudG5lc3NfY2VudGVyZWQiKSwKICAgICAgICAgICAgIGNpLmx2bCA9IDAuOTUsCiAgICAgICAgICAgICBzdGQuZXN0ID0gVCwKICAgICAgICAgICAgIHRpdGxlID0gIiIsCiAgICAgICAgICAgICBzaG93LnZhbHVlcyA9IFRSVUUsCiAgICAgICAgICAgICBjb2xvcnMgPSAiYmxhY2siLAogICAgICAgICAgICAgYXhpcy5sYWJlbHMgPSBjKCJUcmFpdCBydW1pbmF0aW9uICogUGVyY2VpdmVkIHN0cmVzcyIsICJUcmFpdCBydW1pbmF0aW9uIiksCiAgICAgICAgICAgICBheGlzLnRpdGxlID0gIlN0YW5kYXJkaXplZCDOsiBjb2VmZmljaWVudHMiCiAgICAgICAgICAgICApICsKICAgICAgICAgICAgIHlsaW0oMCwgMC42KSArCiAgICAgICAgICAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgICAgICAgICAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9saW5lKHNpemUgPSAuMyksCiAgICAgICAgICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBjb2xvciA9ICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiYmxhY2siKQogICAgICAgICAgICAgICAgICAgKQoKY29lZnBsb3RfdHJhaXQKYGBgCgoKIyBtZWFuIHN0YXRlIHJ1bWluYXRpb24KYGBge3J9CiMgYnVpbGRpbmcgbW9kZWwKbWVhbl9zdGF0ZV9tb2RlbCA8LQogIGxtZXIoCiAgICBOQV9zdW0gfiBhZ2UgKyBnZW5kZXIgKyBiZWVwICsgZGF5ICsKICAgIGV2ZW50X3VucGxlYXNhbnRuZXNzX2NlbnRlcmVkICogbWVhbl9zdGF0ZV9ydW1pX2dyYW5kX2NlbnRlcmVkICsKICAgIChldmVudF91bnBsZWFzYW50bmVzc19jZW50ZXJlZCB8IGlkKSwKICAgIGRhdGEgPSBkYXRfbW9kZWwKICAgICkKCiMgbW9kZWwgb3V0cHV0cwpzdW1tYXJ5KG1lYW5fc3RhdGVfbW9kZWwpCnRhYl9tb2RlbChtZWFuX3N0YXRlX21vZGVsLCBzaG93LnN0ZCA9IFQpCgoKIyBhc3N1bXB0aW9uIGNoZWNrcwpjaGVja19jb2xsaW5lYXJpdHkobWVhbl9zdGF0ZV9tb2RlbCkKcGxvdF9tb2RlbChtZWFuX3N0YXRlX21vZGVsLCB0eXBlID0gImRpYWciKQojY2hlY2tfbW9kZWwobWVhbl9zdGF0ZV9tb2RlbCkKCgojIHZpc3VhbGl6aW5nIHByZWRpY3RlZCB2YWx1ZXMKcGxvdF9tb2RlbChtZWFuX3N0YXRlX21vZGVsKQoKCiMgZ29vZG5lc3Mgb2YgZml0IGluZGljYXRvcnMKQUlDX21lYW5fc3RhdGUgPC0gQUlDKG1lYW5fc3RhdGVfbW9kZWwpCkJJQ19tZWFuX3N0YXRlIDwtIEJJQyhtZWFuX3N0YXRlX21vZGVsKQpgYGAKCgojIyBjb2VmcGxvdCBmb3IgbWVhbiBzdGF0ZSBydW1pbmF0aW9uCmBgYHtyfQpjb2VmcGxvdF9tZWFuX3N0YXRlIDwtIAogIHBsb3RfbW9kZWwobWVhbl9zdGF0ZV9tb2RlbCwKICAgICAgICAgICAgIHR5cGUgPSAic3RkIiwKICAgICAgICAgICAgIHJtLnRlcm1zID0gYygiYWdlIiwgImdlbmRlciBbTWFsZV0iLCAiZ2VuZGVyIFtPdGhlcl0iLCAiYmVlcCIsICJkYXkiLCAiZXZlbnRfdW5wbGVhc2FudG5lc3NfY2VudGVyZWQiKSwKICAgICAgICAgICAgIGNpLmx2bCA9IDAuOTUsCiAgICAgICAgICAgICBzdGQuZXN0ID0gVCwKICAgICAgICAgICAgIHRpdGxlID0gIiIsCiAgICAgICAgICAgICBzaG93LnZhbHVlcyA9IFRSVUUsCiAgICAgICAgICAgICBjb2xvcnMgPSAiYmxhY2siLAogICAgICAgICAgICAgYXhpcy5sYWJlbHMgPSBjKCJNZWFuIHN0YXRlIHJ1bWluYXRpb24gKiBQZXJjZWl2ZWQgc3RyZXNzIiwgIk1lYW4gc3RhdGUgcnVtaW5hdGlvbiIpLAogICAgICAgICAgICAgYXhpcy50aXRsZSA9ICJTdGFuZGFyZGl6ZWQgzrIgY29lZmZpY2llbnRzIgogICAgICAgICAgICAgKSArCiAgICAgICAgICAgICB5bGltKDAsIDAuNikgKwogICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsKICAgICAgICAgICAgIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gLjMpLAogICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgY29sb3IgPSAiYmxhY2siKSwKICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGNvbG9yID0gImJsYWNrIikKICAgICAgICAgICAgICAgICAgICkKCmNvZWZwbG90X21lYW5fc3RhdGUKYGBgCgoKIyBzdGF0ZSBydW1pbmF0aW9uCmBgYHtyfQojIGJ1aWxkaW5nIG1vZGVsCnN0YXRlX21vZGVsIDwtCiAgbG1lcigKICAgIE5BX3N1bSB+IGFnZSArIGdlbmRlciArIGJlZXAgKyBkYXkgKwogICAgZXZlbnRfdW5wbGVhc2FudG5lc3NfY2VudGVyZWQgKiBydW1pbmF0aW9uX2NlbnRlcmVkICsKICAgIChldmVudF91bnBsZWFzYW50bmVzc19jZW50ZXJlZCB8IGlkKSwgZGF0YSA9IGRhdF9tb2RlbAogICAgKQoKCiMgbW9kZWwgb3V0cHV0cwpzdW1tYXJ5KHN0YXRlX21vZGVsKQp0YWJfbW9kZWwoc3RhdGVfbW9kZWwsIHNob3cuc3RkID0gVCkKCgojIGFzc3VtcHRpb24gY2hlY2tzCmNoZWNrX2NvbGxpbmVhcml0eShzdGF0ZV9tb2RlbCkKcGxvdF9tb2RlbChzdGF0ZV9tb2RlbCwgdHlwZSA9ICJkaWFnIikKI2NoZWNrX21vZGVsKHN0YXRlX21vZGVsKQoKCiMgdmlzdWFsaXppbmcgcHJlZGljdGVkIHZhbHVlcwpwbG90X21vZGVsKHN0YXRlX21vZGVsKQoKCiMgZ29vZG5lc3Mgb2YgZml0IGluZGljYXRvcnMKQUlDX3N0YXRlIDwtIEFJQyhzdGF0ZV9tb2RlbCkKQklDX3N0YXRlIDwtIEJJQyhzdGF0ZV9tb2RlbCkKCgoKIyBvdXRwdXRzIGZvciB0cmFpdCwgbWVhbiBzdGF0ZSBhbmQgc3RhdGUgbW9kZWxzCnRhYl9tb2RlbCh0cmFpdF9tb2RlbCwgbWVhbl9zdGF0ZV9tb2RlbCwgc3RhdGVfbW9kZWwsIHNob3cuc3RkID0gVCkKYGBgCgoKIyMgY29lZnBsb3QgZm9yIHN0YXRlIHJ1bWluYXRpb24KYGBge3J9CmNvZWZwbG90X3N0YXRlIDwtIAogIHBsb3RfbW9kZWwoc3RhdGVfbW9kZWwsCiAgICAgICAgICAgICB0eXBlID0gInN0ZCIsCiAgICAgICAgICAgICBybS50ZXJtcyA9IGMoImFnZSIsICJnZW5kZXIgW01hbGVdIiwgImdlbmRlciBbT3RoZXJdIiwgImJlZXAiLCAiZGF5IiwgImV2ZW50X3VucGxlYXNhbnRuZXNzX2NlbnRlcmVkIiksCiAgICAgICAgICAgICBjaS5sdmwgPSAwLjk1LAogICAgICAgICAgICAgc3RkLmVzdCA9IFQsCiAgICAgICAgICAgICB0aXRsZSA9ICIiLAogICAgICAgICAgICAgc2hvdy52YWx1ZXMgPSBUUlVFLAogICAgICAgICAgICAgY29sb3JzID0gImJsYWNrIiwKICAgICAgICAgICAgIGF4aXMubGFiZWxzID0gYygiU3RhdGUgcnVtaW5hdGlvbiAqIFBlcmNlaXZlZCBzdHJlc3MiLCAiU3RhdGUgcnVtaW5hdGlvbiIpLAogICAgICAgICAgICAgYXhpcy50aXRsZSA9ICJTdGFuZGFyZGl6ZWQgzrIgY29lZmZpY2llbnRzIgogICAgICAgICAgICAgKSArCiAgICAgICAgICAgICB5bGltKDAsIDAuNikgKwogICAgICAgICAgICAgdGhlbWVfbWluaW1hbCgpICsKICAgICAgICAgICAgIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gLjMpLAogICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgY29sb3IgPSAiYmxhY2siKSwKICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGNvbG9yID0gImJsYWNrIikKICAgICAgICAgICAgICAgICAgICkKCmNvZWZwbG90X3N0YXRlCmBgYAoKCiMgZnVsbCBtb2RlbApgYGB7ciBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0zfQojIGJ1aWxkaW5nIG1vZGVsCmZ1bGxfbW9kZWwgPC0KICAKICBsbWVyKAogICAgTkFfc3VtIH4gYWdlICsgZ2VuZGVyICsgYmVlcCArIGRheSArCiAgICBldmVudF91bnBsZWFzYW50bmVzc19jZW50ZXJlZCAqIHJ1bWluYXRpb25fY2VudGVyZWQgKyAgCiAgICBldmVudF91bnBsZWFzYW50bmVzc19jZW50ZXJlZCAqIG1lYW5fc3RhdGVfcnVtaV9ncmFuZF9jZW50ZXJlZCArCiAgICBldmVudF91bnBsZWFzYW50bmVzc19jZW50ZXJlZCAqIHRyYWl0X3J1bWluYXRpb24gKwogICAgICAKICAgIChldmVudF91bnBsZWFzYW50bmVzc19jZW50ZXJlZCAqIHJ1bWluYXRpb25fY2VudGVyZWQgfCBpZCksIGRhdGEgPSBkYXRfbW9kZWwsCiAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0Q3RybD1saXN0KGZ0b2xfYWJzPTFlLTgseHRvbF9hYnM9MWUtOCkpCiAgICApCgoKIyBtb2RlbCBvdXRwdXRzCnN1bW1hcnkoZnVsbF9tb2RlbCkKdGFiX21vZGVsKGZ1bGxfbW9kZWwsIHNob3cuc3RkID0gVCkKCgojIGFzc3VtcHRpb24gY2hlY2tzCmNoZWNrX2NvbGxpbmVhcml0eShmdWxsX21vZGVsKQpwbG90X21vZGVsKHN0YXRlX21vZGVsLCB0eXBlID0gImRpYWciKQojIGNoZWNrX21vZGVsKGZ1bGxfbW9kZWwpCgoKIyB2aXN1YWxpemluZyBwcmVkaWN0ZWQgdmFsdWVzCiMgcG5nKCkKcGxvdF9tb2RlbChmdWxsX21vZGVsKQojIGRldi5vZmYoKQoKIyBnb29kbmVzcyBvZiBmaXQgaW5kaWNhdG9ycwpBSUNfZnVsbCA8LSBBSUMoZnVsbF9tb2RlbCkKQklDX2Z1bGwgPC0gQklDKGZ1bGxfbW9kZWwpCmBgYAoKCgojIGNvZWZwbG90cyBmb3IgZnVsbCBtb2RlbApgYGB7cn0KIyBwbG90IGZvciBpbnRlcmFjdGlvbnMgKGNvbG9yZWQgYWZ0ZXJ3YXJkcyBpbiBwaG90b3Nob3ApCmNvZWZwbG90X2ludGVyYWN0aW9ucyA8LSAKICBwbG90X21vZGVsKGZ1bGxfbW9kZWwsCiAgICAgICAgICAgICB0eXBlID0gInN0ZCIsCiAgICAgICAgICAgICBybS50ZXJtcyA9IGMoInJ1bWluYXRpb25fY2VudGVyZWQiLCAidHJhaXRfcnVtaW5hdGlvbiIsICJtZWFuX3N0YXRlX3J1bWlfZ3JhbmRfY2VudGVyZWQiLCAiYWdlIiwgImdlbmRlciBbTWFsZV0iLCAiZ2VuZGVyIFtPdGhlcl0iLCAgICJiZWVwIiwgImRheSIsICJldmVudF91bnBsZWFzYW50bmVzc19jZW50ZXJlZCIpLAogICAgICAgICAgICAgY2kubHZsID0gMC45NSwKICAgICAgICAgICAgIHN0ZC5lc3QgPSBULAogICAgICAgICAgICAgdGl0bGUgPSAiIiwKICAgICAgICAgICAgIHNob3cudmFsdWVzID0gVFJVRSwKICAgICAgICAgICAgIGNvbG9ycyA9ICJibGFjayIsCiAgICAgICAgICAgICBheGlzLmxhYmVscyA9IGMoIlRyYWl0IHJ1bWluYXRpb24gKiBQZXJjZWl2ZWQgc3RyZXNzIiwgIk1lYW4gc3RhdGUgcnVtaW5hdGlvbiAqIFBlcmNlaXZlZCBzdHJlc3MiLCAiU3RhdGUgcnVtaW5hdGlvbiAqIFBlcmNlaXZlZCBzdHJlc3MiKSwKICAgICAgICAgICAgIGF4aXMudGl0bGUgPSAiU3RhbmRhcmRpemVkIM6yIGNvZWZmaWNpZW50cyIKICAgICAgICAgICAgICkgKwogICAgICAgICAgICAgeWxpbSgwLCAwLjEpICsKICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArCiAgICAgICAgICAgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBjb2xvciA9ICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiYmxhY2siKSwKICAgICAgICAgICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gLjMpCiAgICAgICAgICAgICAgICAgICApCgpjb2VmcGxvdF9pbnRlcmFjdGlvbnMKCgojIHBsb3QgZm9yIG1haW4gZWZmZWN0cyAoY29sb3JlZCBhZnRlcndhcmRzIGluIHBob3Rvc2hvcCkKY29lZnBsb3RfbWFpbmVmZmVjdHMgPC0gCiAgcGxvdF9tb2RlbChmdWxsX21vZGVsLAogICAgICAgICAgICAgdHlwZSA9ICJzdGQiLAogICAgICAgICAgICAgdGVybXMgPSBjKCJydW1pbmF0aW9uX2NlbnRlcmVkIiwgIm1lYW5fc3RhdGVfcnVtaV9ncmFuZF9jZW50ZXJlZCIsICJ0cmFpdF9ydW1pbmF0aW9uIiksCiAgICAgICAgICAgICBjaS5sdmwgPSAwLjk1LAogICAgICAgICAgICAgc3RkLmVzdCA9IFRSVUUsCiAgICAgICAgICAgICB0aXRsZSA9ICIiLAogICAgICAgICAgICAgc2hvdy52YWx1ZXMgPSBUUlVFLAogICAgICAgICAgICAgY29sb3JzID0gImJsYWNrIiwKICAgICAgICAgICAgIGF4aXMubGFiZWxzID0gYygiVHJhaXQgcnVtaW5hdGlvbiIsICJNZWFuIHN0YXRlIHJ1bWluYXRpb24iLCAiU3RhdGUgcnVtaW5hdGlvbiIpLAogICAgICAgICAgICAgYXhpcy50aXRsZSA9ICJTdGFuZGFyZGl6ZWQgzrIgY29lZmZpY2llbnRzIgogICAgICAgICAgICAgKSArCiAgICAgICAgICAgICB5bGltKDAsIDEpICsKICAgICAgICAgICAgIHRoZW1lX21pbmltYWwoKSArCiAgICAgICAgICAgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBjb2xvciA9ICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiYmxhY2siKSwKICAgICAgICAgICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gLjMpCiAgICAgICAgICAgICAgICAgICApCgpjb2VmcGxvdF9tYWluZWZmZWN0cwpgYGAKCgojIHNhdmluZyBmdWxsIG1vZGVsIGZvciBib290c3RyYXBwaW5nCmBgYHtyfQpzYXZlUkRTKGZ1bGxfbW9kZWwsICJzYXZlZF9tb2RlbHMvZnVsbF9tb2RlbC5yZHMiKQpgYGAKCg==